/*
 * Copyright (c) 2006-2021, RT-Thread Development Team
 *
 * SPDX-License-Identifier: Apache-2.0
 *
 * Change Logs:
 * Date           Author       Notes
 * 2025-01-06     86157       the first version
 */
#ifndef SET_FRAMEINFO_H_
#define SET_FRAMEINFO_H_

#include "j1939.h"
#include "j1939_config.h"
#include "string.h"
#include "stdio.h"

#define FIXED_LEN  6    //定值设置报文固定帧长度

/*
 遥控命令帧

 */
typedef struct {

    struct control_byte
    {
        j1939_uint8_t reserved : 1; // 预留位
        j1939_uint8_t main_contact_status : 1; // 充电回路主接触器状态
        j1939_uint8_t power_distribution_contact_status : 1; // 功率分配回路接触器状态
        j1939_uint8_t voltage_output_range : 1; // 电压输出范围选择
        j1939_uint8_t operation_instructions : 4; // 操作指令
    }control_byte;

    struct group_byte
    {
        j1939_uint8_t eight_group : 1;  //第八组
        j1939_uint8_t seven_group : 1;  //第七组
        j1939_uint8_t six_group : 1;    //第六组
        j1939_uint8_t fifty_group : 1;  //第五组
        j1939_uint8_t four_group : 1;   //第四组
        j1939_uint8_t three_group : 1;  //第三组
        j1939_uint8_t two_group : 1;    //第二组
        j1939_uint8_t one_group : 1;    //第一组
    }group_byte;

    j1939_uint8_t group_encoding; //分组编码

    j1939_uint16_t set_vdc;      //给定电压
    j1939_uint16_t set_current;  //给定电流
    j1939_uint16_t battery_vdc;  //电池电压

} ChargingControlInfo;

enum cmd
{
    QUICK_START = 0x01,         //快速开机（绝缘检测阶段使用）
    STOP_CHARG,                 //停止充电
    SOFT_START,                 //软启开机（预启动阶段使用）
    ADDRESS,                    //显示地址（显示模块通信地址）
    PARM_REVISE,                //参数修改
}cmd;

/*
 * 定值设置命令帧
 */
typedef struct
{
    j1939_uint8_t charg_flag;   //充电接口标识
    j1939_uint8_t device_type;  //设备类型
    j1939_uint8_t address;      //设备通信地址
    j1939_uint16_t order;       //定值序号
    j1939_uint8_t reserved;     //预留
    j1939_uint16_t fix_info;     //定值信息
    j1939_uint8_t fix_info_len;  //定值信息长度
}FixedValueSet;

enum Device_type
{
    ZHILIU = 0x01,     //充电控制器（直流充电机）
    JIAOLIU,        //充电控制器（交流充电桩）
    POWER_CTRL,     //功率控制模块（直流充电机）
    CHARGE,         //充电模块
    SWITCH,         //开关模块
    ENV_INFO,       //环境信息采集模块
}Device_type;


/*
 * 多帧数据帧格式
 */
typedef struct
{
    j1939_uint8_t frame_one;    //第一帧
    j1939_uint16_t effic_byte;  //有效字节
    j1939_uint8_t frame_two;    //第二帧
    j1939_uint16_t checksum;    //校验码
    j1939_uint8_t frame_num;    //帧数量
}FrameFormat;


/*
    分组设置命令帧
*/
typedef struct GroupSetFrame
{
    /* data */
    //命令码
    struct cmd_byte
    {
        j1939_uint8_t reversed1 : 1;    //预留
        j1939_uint16_t group_set_undo : 2;//分组设置/撤销
        j1939_uint16_t addr_select : 2; //地址选择
        j1939_uint16_t reversed2 : 3;   //预留
    }cmd_byte;

    j1939_uint8_t group_num;    //组号
    j1939_uint8_t addr_num;     //地址数目
    j1939_uint32_t addr_info;   //地址信息
    j1939_uint8_t addr_info_end;//待分配模块的终止地址
}GroupSetFrame;


/**************************************************** 接收帧信息 ****************************************************** */

/*
    遥信遥测数据帧1
*/

struct YC_YX_MSG1
{
    struct state
    {
        j1939_uint8_t work_state : 2;   //工作状态
        j1939_uint8_t warn_state : 1;   //报警状态
        j1939_uint8_t fault_state : 1;  //错误状态
        j1939_uint8_t group_mode : 2;   //分组模式
        j1939_uint8_t received : 2;     //预留
    }state;

    struct warn_fault
    {
        j1939_uint8_t ac_in_fault : 1;         //交流输入故障
        j1939_uint8_t dc_out_over_fault : 1;   //直流输出过压故障
        j1939_uint8_t dc_out_under_fault : 1;  //直流输出欠压故障
        j1939_uint8_t temp_over_fault : 1;     //过温故障
        j1939_uint8_t dc_out_sc_fault : 1;     //直流输出短路故障
        j1939_uint8_t fan_fault : 1;           //风扇故障
        j1939_uint8_t vent_fault : 1;          //泄放故障
        j1939_uint8_t another_fault : 1;       //其他故障
    }warn_fault;
    
    j1939_uint16_t dc_out_voc;      //直流输出电压
    j1939_uint16_t dc_out_cur;      //直流输出电流
    j1939_uint8_t group_number;     //当前组号
};

/*
    遥信遥测数据帧2
*/

struct YC_YX_MSG2
{
    struct alarm_state
    {
        j1939_uint16_t over_temp_warning : 1;           // Bit15: 过温告警  
        j1939_uint16_t output_overcurrent_warning : 1;  // Bit14: 输出过流告警  
        j1939_uint16_t input_over_voltage_warning : 1;  // Bit13: 输入过压告警  
        j1939_uint16_t input_under_voltage_warning : 1; // Bit12: 输入欠压告警  
        j1939_uint16_t input_phase_loss_warning : 1;    // Bit11: 输入缺相告警  
        j1939_uint16_t communication_fault : 1;         // Bit10: 通信故障  
        j1939_uint16_t start_failure : 1;               // Bit9 : 启动失败  
        j1939_uint16_t shutdown_failure : 1;            // Bit8 : 关机失败  
        j1939_uint16_t module_address_error : 1;        // Bit7 : 充电模块地址异常故障  
        j1939_uint16_t received : 7;                    //Bit6-0: 预留
    }alarm_state;
    
};

/*
    遥控应答帧
 */
typedef struct {

    struct YD_control_byte
    {
        j1939_uint8_t success_flag : 1; // 成功标识
        j1939_uint8_t main_contact_status : 1; // 充电回路主接触器状态
        j1939_uint8_t power_distribution_contact_status : 1; // 功率分配回路接触器状态
        j1939_uint8_t voltage_output_range : 1; // 电压输出范围选择
        j1939_uint8_t operation_instructions : 4; // 操作指令
    }YD_control_byte;

    struct YD_group_byte
    {
        j1939_uint8_t eight_group : 1;  //第八组
        j1939_uint8_t seven_group : 1;  //第七组
        j1939_uint8_t six_group : 1;    //第六组
        j1939_uint8_t fifty_group : 1;  //第五组
        j1939_uint8_t four_group : 1;   //第四组
        j1939_uint8_t three_group : 1;  //第三组
        j1939_uint8_t two_group : 1;    //第二组
        j1939_uint8_t one_group : 1;    //第一组
    }YD_group_byte;

    j1939_uint8_t group_encoding; //分组编码

    j1939_uint16_t set_vdc;      //给定电压
    j1939_uint16_t set_current;  //给定电流
    j1939_uint16_t battery_vdc;  //电池电压

} ReceiveInfo;

extern ChargingControlInfo control_info;
extern FixedValueSet fix_val_CMD_DY;
extern FrameFormat format;
extern GroupSetFrame type_group_set;

void set_charging_param(uint8_t operation_instructions, uint8_t voltage_output_range);
void SetFixVal_DYGroup(uint8_t charg_flag, uint8_t address, uint8_t order, uint8_t fix_info, uint8_t fix_info_len);
void group_set(uint8_t group_set_undo, uint8_t addr_select, uint8_t group_num, uint8_t addr_num, uint8_t addr_info, uint8_t addr_info_end);


#endif /* APPLICATIONS_SET_FRAMEINFO_H_ */
